home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 November
/
EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso
/
earcd
/
ead
/
ead27.dms
/
ead27.adf
/
Listati
/
NewEx.asm
/
NewEx.asm
Wrap
Assembly Source File
|
1990-12-25
|
15KB
|
342 lines
***************************************************************
* *
* Programma ...... NewEx. asm *
* *
* Autore ......... Kjell Cederfeldt *
* *
* Versione ....... 1.00, 11 giugno 1990 *
* *
* Funzione ....... Esecutore di programmi Shell da Workbench *
* *
***************************************************************
ExecBase = 4
OpenLibrary = -408 ; exec offset OpenLibrary(libName,version)(A1,D0)
CloseLibrary = -414 ; exec offset CloseLibrary(library)(a1)
FindTask = -294 ; exec offset FindTask(name)(a1)
WaitPort = -384 ; exec offset WaitPort(port)(a0)
GetMsg = -372 ; exec offset GetMsg(port)(a0)
ReplayMsg = -378 ; exec offset ReplayMsg(message)(a1)
Forbid = -132 ; exec offset Forbid()
Open = -30 ; dos offset Open(name,accessMode)(D1/D2)
Close = -36 ; dos offset Close(file)(D1)
Write = -48 ; dos offset Write(file,buffer,length)(d1/d2/d3)
OutPut = -60 ; dos offset OutPut()
Lock = -84 ; dos offset! Lock(name,mode)(d1,d2)
UnLock = -90 ; dos offset! UnLock(lock)(d1)
Examine = -102 ; dos offset! Examine(Lock,InfoBlock)(d1,d2)
CurrentDir = -126 ; dos offset CurrentDir(lock)(d1)
ParentDir = -210 ; dos offset! ParentDir(lock)(d1)
Execute = -222 ; dos offset Execute(string,file,file)(D1/D2/D3)
GetDiskObject = -78 ; icon offset GetDiskObject(name)(a0)
FindToolType = -96 ; icon offset FindToolType(toolTypeArray,typeName)(A0/A1)
FreeDiskObject = -90 ; icon offset FreeDiskObject(diskobj)(a0)
Mode_old = 1005 ;
Mode_new = 1006 ;
Access_read = -2
move.l sp,Initial_SP ; Salva stackpointer
move.l a0,Filename ; CLI=salva davvero indirizzo arg.
sub.l #1,d0 ; Decrementa lunghezza di uno
add.l d0,a0 ; Somma lunghezza ad indirizzo
move.b #0,(a0) ; Azzera ultimo byte (CLI=0A)
move.l #0,RetCode ; Azzera Returncode
START: move.l ExecBase,a6
suba.l a1,a1 ; Indirizzo di questo task
jsr FindTask(a6)
move.l d0,a4 ; Salva struttura in a4
tst.l $ac(a4) ; CLI or WB ?
bne CliStart
; ** Questo vale solo quando si parte da Workbench
move.l #49,RetCode ; Assegna Returncode
lea $5c(a4),a0 ; Messaggio WBench
jsr WaitPort(a6) ; Attendi
jsr GetMsg(a6) ; Carica messaggio
move.l d0,Message ; Salva puntatore a WBMessage
beq Slut ; Errore!
move.l #48,RetCode ; Fissa ReturnCode
move.l Message,a0 ; Puntatore a WBMessage
move.l $24(a0),a0 ; Lista argomenti
beq Slut2 ; Nessun argomento
CliStart:
; ** Apre icon.library
move.l #47,RetCode ; Assegna Returncode
lea Iconname(pc),a1 ; Carica indirizzo di IconName in a1
clr.l d0 ; Tutte le versioni
jsr OpenLibrary(a6) ; Apre IconLibrary
move.l d0,Iconbase ; Salva Iconbase
beq Error1 ; Salta su errore!
; ** Apre dos.library
move.l #46,RetCode ; Assegna ReturnCode
lea Dosname(pc),a1 ; Indirizzo di DosName in a1
clr.l d0 ; Tutte le DosVersion
jsr OpenLibrary(a6) ; Apre doslibrary
move.l d0,DosBase ; Salva Dosbase
beq Error2 ; Salta su errore!
jsr PointTOCLI ; Ricava puntatore CLI
tst.l Message ; Se partuto da CLI
beq InFileOpen ; Salta su FileOpens
; ** Apre Directory corrente
move.l #45,RetCode ; Assegna Returncode
move.l Message,a0 ; Puntatore a WBMessage sm_ArgList
move.l $24(a0),a0 ; Sposta puntatore a wa_Lock
beq Error3 ; Errore!
move.l (a0),d1 ; D1 => Lock
move.l DosBase,a6
jsr CurrentDir(a6) ; Lock Current Dir
; ** Legge diskobject (.info file)
move.l #44,RetCode ; Assegna ReturnCode
move.l Message,a0
move.l $24(a0),a0
move.l 4(a0),a0 ; Sposta puntatore a wa_Name
move.l a0,Filename
move.l Iconbase,a6
jsr GetDiskObject(a6) ; Legge diskobject
move.l d0,Diskobj ; Salva diskobject
beq Error3 ; Errore!
move.l d0,a1
move.l $36(a1),a1 ; Puntatore a ToolType Array
move.l a1,ToolTypeArray ; Salva puntatore
; ** Legge argomento da tool icon (tooltype)
move.l Iconbase,a6
move.l ToolTypeArray,a0
move.l #typeName1,a1
jsr FindToolType(a6)
move.l d0,Inname
move.l ToolTypeArray,a0
move.l #typeName2,a1
jsr FindToolType(a6)
move.l d0,Outname
; ** Apre outfile
move.l #43,RetCode ; Assegna Returncode
move.l DosBase,a6 ; Carica dosbase
move.l Outname,d1 ; Leggi filename
move.l #Mode_new,d2 ; 1006=Nuovo File: 1005=Esistente
jsr Open(a6) ; Apre file
move.l d0,Outhandle ; Salva filehandler
beq Error3 ; Salta per errore
; ** Apre file di lettura
InFileOpen:
move.l #42,RetCode ; Assegna Returncode
move.l Filename,d1 ; Carica filename
tst.l Message ; Verifica se da WB o da CLI?
beq.s InOpLab ; Salata se da CLI
move.l Inname,d1 ; Carica filename
InOpLab: move #Mode_old,d2 ; 1005=Existing file : 1006=NewFile
move.l DosBase,a6 ; Carica dosbase
jsr Open(a6) ; Apre file
move.l d0,InHandle ; Salva filehandler
bne BldPath ; Salta se non ci sono errori
tst.l Message ; Verifica se da WB o da CLI?
bne.s Err ; Salta se da Woorkbench
move.l CLIPoint,d1
move.l #Textfld,d2
move.l #84,d3
jsr Write(a6)
Err: bra Error4
; ** Legge e costruisce pathway
BldPath: jsr GetPath ; Costruisce path
; ** Chiama Execute (funzione DOS)
move.l #0,RetCode ; Azzera Returncode
move.l CLIPoint,d3
tst.l Message ; Verifica se da WB o da CLI
beq.s Exlabel ; Termina se da CLI
move.l Outhandle,d3 ; Legge handler del file
Exlabel: move.l PathStart,d1 ; Legge puntatore della stringa
move.l InHandle,d2 ; Legge handler del file
jsr Execute(a6) ; Esegue un file script (dos)
; ** Close files
Cleanup1: move.l InHandle,d1
jsr Close(a6)
Error4: tst.l Message ; Verifica se da Wb o da CLI
beq.s temp ; Salta a fine se da CLI
move.l Outhandle,d1
jsr Close(a6)
Error3: move.l Iconbase,a6 ; Carica Iconbase
move.l Diskobj,a0 ; Legge struttura diskobject
jsr FreeDiskObject(a6) ; Free Diskobject
temp: move.l DosBase,a1 ; Carica Dosbase
move.l ExecBase,a6
jsr CloseLibrary(a6) ; Chiuse Doslibrary:
Error2: move.l Iconbase,a1 ; Carica IconBase
move.l ExecBase,a6
jsr CloseLibrary(a6) ; Chiudi Iconlibrary
Error1: tst.l Message ; Verifica se da WB o da CLI
beq.s Slut ; Salta a fine se da CLI
Slut2: jsr Forbid(a6)
move.l Message,a1
jsr ReplayMsg(a6) ; Elimina struttura reply
Slut: move.l Initial_SP,sp ; Carica blocco partenza
clr.l d0
move.l RetCode,d0 ; Scrive returncode in D0
rts
; **** Dati di sistema
Initial_SP: dc.l 0
RetCode: dc.l 0
Iconbase: dc.l 0
DosBase: dc.l 0
InHandle: dc.l 0
Outhandle: dc.l 0
Message: dc.l 0
Diskobj: dc.l 0
CLIPoint: dc.l 0
Filename: dc.l 0
NewLock: dc.l 0
ParLock: dc.l 0
Inname: dc.l 0
Outname: dc.l 0
PathStart: dc.l 0
Dosname: dc.b 'dos.library',0
cnop 0,4
Iconname: dc.b 'icon.library',0
cnop 0,4
TempNamn: dcb.b 32,0
cnop 0,4
Path: dcb.b 255,0
cnop 0,4
typeName1: dc.b "FILENAME",0,0
cnop 0,4
typeName2: dc.b "WINDOW",0,0
cnop 0,4
Textfld: dc.b 27,"[33mNewEx Version 1.1 by Kjell Cederfeldt",13,10,10
dc.b "No file name or file not found!",27,"[31m",13,10,10
cnop 0,4
ToolTypeArray: dc.l 0
IconText: dc.l 0
FileInfoBlock: dcb.b 260,0
cnop 0,4
; ReturnCode 47 = icon.library not open
; ReturnCode 46 = dos.library not open
; ReturnCode 45 = currentdir not lock
; ReturnCode 44 = diskobjekt not found
; ReturnCode 43 = outfile (device) not found
; ReturnCode 42 = infile (device) not found
; ***** S U B R O U T I N E S *****
PointTOCLI:
; Funzione di output sulla finestra CLI già aperta se esecuzione è da CLI
move.l DosBase,a6 ; Puntatore DOS.library
jsr OutPut(a6) ; Legge puntatore di output Dos!
move.l d1,CLIPoint ; Salva puntatore
rts
;***************************************************************************
GetPath:
move.l #Path,d2 ; Legge indirizzo di Path
add.l #253,d2 ; Sottrae 2
move.l d2,PathStart ; Legge indirizzo della pathstring
move.l DosBase,a6 ; Carica DOSBasc
move.l #Filename,d1 ; Carica puntatore di nome file
move.l Access_read,d2 ; Modo Solo lettura
jsr Lock(a6) ; Bloccaggio
tst.l d0
beq EndLoop ; File introvabile
move.l d0,NewLock ; Memorizza Lock
MainLoop: move.l NewLock,d1 ; Legge lock
move.l #FileInfoBlock,d2 ; Legge indirizzo nel blocco
jsr Examine(a6) ; Legge fileinfo
tst.l d0
beq EndLoop
move.l #FileInfoBlock,d2
add.l #8,d2 ; Aggiunge offset all'indirizzo
clr.l d0 ; Azzera contatore
move.l d2,a0 ; Sposta filepointer in A0
move.l #TempNamn,a1 ; Sposta pathpointer in A1
Loop: move.b (a0)+,(a1)+ ; Sposta valore A0 => A1
add.l #1,d0 ; Decrementa contatore
tst.b (a0) ; Fine nome (0 di termine)?
bne.s Loop ; No: cicla
move.b #47,(a1)+ ; Aggiunge '/'
add.l #1,d0 ; Decrementa contatore
move.l PathStart,d2 ; Legge path di partenza
move.l d2,a0
Loop2: move.b -(a1),-(a0) ; Salva struttura di path
sub.l #1,d0 ; Incrementa contatore
bne.s Loop2
move.l a0,PathStart ; Salva pathstart
move.l NewLock,d1 ; Legge Lock
jsr ParentDir(a6) ; Vai a DIR parente
move.l d0,ParLock ; Salva lock
move.l NewLock,d1 ; Legge lock
jsr UnLock(a6) ; Rilascia lock
move.l ParLock,d0 ; Legge lock
move.l d0,NewLock ; Muove lock
tst.l d0 ; Siamo nella radice
bne MainLoop ; Nessun salto
move.l PathStart,a1 ; Legge pathstart
Kolon: cmp.b #47,(a1)+ ; Trovato prima '/'
bne.s Kolon
move.b #58,-(a1) ; Modifica in ':'
move.l PathStart,a1 ; Legge pathstart
move.b #34,-(a1) ; somma '"'
move.b #32,-(a1) ; somma ' '
move.b #68,-(a1) ; somma 'D'
move.b #67,-(a1) ; somma 'C'
move.l a1,PathStart ; salva niova partenza
move.l #Path,a1
add.l #253,a1
move.b #34,(a1)
EndLoop: rts
end